using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, ISerializationCallbackReceiver
{
    [SerializeField]
    private List<TKey> keys = new List<TKey>(); // 序列化保存键的列表
    [SerializeField]
    private List<TValue> values = new List<TValue>(); // 序列化保存值的列表

    // 在序列化之前调用
    public void OnBeforeSerialize()
    {
        keys.Clear(); // 清空键列表
        values.Clear(); // 清空值列表
        foreach (KeyValuePair<TKey, TValue> pair in this)
        {
            keys.Add(pair.Key); // 把字典中的键添加到列表中
            values.Add(pair.Value); // 把字典中的值添加到列表中
        }
    }

    // 在反序列化之后调用
    public void OnAfterDeserialize()
    {
        this.Clear(); // 清空字典
        if (keys.Count != values.Count)
        {
            throw new System.Exception(string.Format("There are {0} keys and {1} values after deserialization. Make sure that both key and value types are serializable.", keys.Count, values.Count));
        }
        for (int i = 0; i < keys.Count; i++)
        {
            this.Add(keys[i], values[i]); // 把列表中的键值对添加到字典中
        }
    }
}
